home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks96 / BootingGallery.sit / Booting Gallery / Booting Gallery (source) / iconhack Folder / Blitter.jbx.c < prev    next >
Text File  |  1996-06-22  |  11KB  |  378 lines

  1. #define using_MacTraps 1
  2.  
  3. #include <Traps.h>
  4.  
  5. #include "Blitter.h"
  6.  
  7. typedef struct {
  8.     long    Icon[32];
  9.     long    IconMask[32];
  10. } ICONList, *ICONListPtr;
  11.  
  12. static pascal void INITDraw1Bit(ICONListPtr iconPtr);
  13. static pascal void INITDrawCQD(CIconHandle);
  14. static pascal void INITDrawXBit(void *icl_Ptr, short iclDepth, ICONListPtr iconPtr);
  15.  
  16. Handle    icl8, icl4, icn;
  17. short    haveICN, have4, have8;
  18.  
  19. short    myV, myH, curOffset;
  20. Rect    curRect;
  21.  
  22. short    blitEnabled;
  23.  
  24. CTabHandle    gClutThing4; // (CTabHandle) RGetResource('clut', iclDepth);
  25. CTabHandle    gClutThing8; // (CTabHandle) RGetResource('clut', iclDepth);
  26.  
  27. THz BlitZone;
  28.  
  29. static void (*UndoBlitProc)(void);
  30.  
  31. void Blit(short iconID) {
  32.     Handle    h;
  33.  
  34.     while (curOffset != 0) BackBlit();
  35.  
  36.     UndoBlitProc = 0;
  37.  
  38.     blitEnabled = 0;
  39.  
  40.     if (gClutThing4 == 0) {
  41.         gClutThing4 = (CTabHandle) RGetResource('clut', 4);
  42.         gClutThing8 = (CTabHandle) RGetResource('clut', 8);
  43.     }
  44.  
  45.     haveICN = have4 = have8 = 0;
  46.     
  47.     if (!icl8) {
  48.         icl8 = NewHandleSysClear(1024); // 32 x 32 x 8 bits
  49.         HLock(icl8);
  50.     }
  51.     if (!icl4) {
  52.         icl4 = NewHandleSysClear(512); // 32 x 32 x 4 bits
  53.         HLock(icl4);
  54.     }
  55.     if (!icn) {
  56.         icn = NewHandleSysClear(256); // 32 x 32 x 1 bits x 2
  57.         HLock(icn);
  58.     }
  59.     if (0 != (h = Get1Resource('ICN#', iconID))) {
  60.         BlockMove(*h, *icn, 256);
  61.         haveICN = 1;
  62.     }
  63.     if (0 != (h = Get1Resource('icl4', iconID))) {
  64.         BlockMove(*h, *icl4, 512);
  65.         have4 = 1;
  66.     }
  67.     if (0 != (h = Get1Resource('icl8', iconID))) {
  68.         BlockMove(*h, *icl8, 1024);
  69.         have8 = 1;
  70.     }
  71.     curOffset = -1;
  72.     blitEnabled = 1;
  73. }
  74.  
  75. void BackBlit(void) {
  76.     THz        oldZone;
  77.     short    oldMemError;
  78.     char    oldNameByte;
  79.  
  80.     if (!blitEnabled) return;
  81.     if (!haveICN) {
  82.         curOffset = 0;
  83.         return;
  84.     }
  85.     blitEnabled = 0;
  86.     oldMemError = *(short *)0x220;
  87.     oldZone = GetZone();
  88.     SetZone(BlitZone);
  89.     if (curOffset == -1) {
  90.         curOffset = *(short *)0xC20 - myH - 40;
  91.         if (curOffset < 0) curOffset = 0;
  92.     }
  93.     if (curOffset > 0) {
  94.         curOffset -= 8;
  95.         if (curOffset < 0) curOffset = 0;
  96.     }
  97.     oldNameByte = *(char *)0x910;
  98.     *(char *)0x910 = 1;
  99.     if (UndoBlitProc) {
  100.         UndoBlitProc();
  101.         UndoBlitProc = 0;
  102.     }
  103.     if (have8) {
  104.         INITDrawXBit((void *)*icl8, 8, (void *)*icn);
  105.     } else if (have4) {
  106.         INITDrawXBit((void *)*icl4, 4, (void *)*icn);
  107.     } else {
  108.         INITDraw1Bit((void *)*icn);
  109.     }
  110.     *(char *)0x910 = oldNameByte;
  111.     SetZone(oldZone);
  112.     *(short *)0x220 = oldMemError;
  113.     if (curOffset != 0) blitEnabled = 1;
  114. }
  115.  
  116. enum {
  117.     firstX            =    8,            /* X coordinate of first icon to be drawn        */
  118.     bottomEdge        =    8+32,        /* this far from bottom of screen                */
  119.     iconWidth        =    32,            /* size of icon (square normally)                */
  120.     defaultMoveX    =    40,            /* x default amount to move icons                */
  121.     defaultMoveY    =    40,            /* y icon line height                            */
  122.     checksumConst    =    0x1021,        /* constant used for computing checksum            */
  123.  
  124.     iconRowBytes    =    32/8,        /* 32/8 bits                                    */
  125.  
  126.     hasCQDBit        =    6            /* this bit in ROM85 is cleared if Color QuickDraw is available */
  127. };
  128.  
  129. static long        saveA5;
  130. static long        localA5;
  131.  
  132. static Rect srcRect = {0,0,32,32};    /* for copybits */
  133. static Rect    destRect= {0,0,32,32};
  134.  
  135. static BitMap myBitMap = {
  136.     0,                /* address */
  137.     iconRowBytes,    /* rowBytes */
  138.     0,0,32,32        /* Rect */
  139. };
  140. static BitMap myMaskMap = {
  141.     0,                /* address */
  142.     iconRowBytes,    /* rowBytes */
  143.     0,0,32,32        /* Rect */
  144. };
  145. static GrafPort    myPort;
  146.  
  147.  
  148. /***************************************************************************************\
  149. |                                                                                        |
  150. |    Initializes the world and sets up the drawing rectangle                                |
  151. |                                                                                        |
  152. \***************************************************************************************/
  153.  
  154. static asm void INITInitSimple(void) {
  155.             // CurrentA5 = 0x904
  156.         move.l    0x904,saveA5    // PM 10/6 save host A5
  157.         lea        localA5,a5            // PM7/21
  158.         move.l    a5,0x904
  159.         pea        qd.thePort                // PM 10/6 use a5 reference instead of a6
  160.         _InitGraf                    // fixes color bug as per DA@ICOM
  161.         pea        myPort
  162.         _OpenPort
  163.         rts
  164. }
  165.  
  166. static asm void INITInit(void) {
  167.             // CurrentA5 = 0x904
  168.         move.l    0x904,saveA5    // PM 10/6 save host A5
  169.         lea        localA5,a5            // PM7/21
  170.         move.l    a5,0x904
  171.         pea        qd.thePort                // PM 10/6 use a5 reference instead of a6
  172.         _InitGraf                    // fixes color bug as per DA@ICOM
  173.         pea        myPort
  174.         _OpenPort
  175.  
  176.         move.w    myV,d0            // get my v var
  177.         bne.s    @ScratchVOK        // checks, so go on test my h var
  178.  
  179.         move.w    myPort.portBits.bounds.bottom,d0 // else initialize as first time
  180.         sub.w    #160,d0
  181.         sub.w    #bottomEdge,d0
  182.         move    d0,myV
  183. @ScratchVOK:
  184.         move.w    myH,d0            // get my h var
  185.         bne.s    @ScratchHOK        // checks, so go on
  186.         move    #firstX,myH        // else initialize as first time
  187. @ScratchHOK:
  188.         move.l    myV,d0            // trickery - high word is V, lo word is H.
  189.  
  190.         move.w    d0,d1            // get future position
  191.         add.w    #iconWidth,d1    // compute future rect right
  192.         cmp.w    myPort.portBits.bounds.right,d1 // compare to main screen right
  193.         blt.s    @DontChangeLine    // smaller - do nothing
  194.  
  195.         move.w    myV,d0            // decrement Y value
  196.         subi.w    #defaultMoveY,d0
  197.         move.w    d0,myV
  198.         move.w    #firstX,myH        // set X to initial value
  199.  
  200.         move.l    myV,d0
  201. @DontChangeLine:
  202.         lea        destRect,a0
  203.         move.l    d0,(a0)+
  204.         move.l    d0,(a0)
  205.         rts
  206. }
  207.  
  208. /***************************************************************************************\
  209. |                                                                                        |
  210. |    Based on the mask, advances the icon drawing position and adjusts destRect            |
  211. |                                                                                        |
  212. \***************************************************************************************/
  213.  
  214. static asm void MaskAdjust(void) {
  215. //    if (curOffset > 0) return;
  216.         lea        myMaskMap,a0
  217.         move.l    (a0)+,a1        // baseAddr
  218.         move.w    (a0)+,d0        // rowBytes
  219.         move.w    4(a0),d1        // bottom
  220.         move.w    6(a0),d2        // right
  221.         sub.w    (a0)+,d1        // top - d1 now has height.
  222.         sub.w    (a0)+,d2        // left - d2 now has width.
  223.         add.w    d1, destRect.bottom
  224.         add.w    d2, destRect.right
  225.         tst.w    curOffset
  226.         bgt.s    @out
  227.         add.w    d2,myH            // assume the icon is properly done,
  228.         addq.w    #8,myH
  229. @out:
  230.         rts
  231. }
  232.  
  233. /***************************************************************************************\
  234. |                                                                                        |
  235. |    Cleans up the work done by INITInit and advances the icon drawing position            |
  236. |                                                                                        |
  237. \***************************************************************************************/
  238.  
  239. static asm void INITCleanup(void) {
  240.         pea        myPort            // *** (DBA) I think that QuickDraw leaves handles around.
  241.         _ClosePort                // *** (DBA) Too bad we can't get rid of them...
  242.  
  243.         move.l    saveA5,a5        // PM 10/6 restore host A5
  244.         move.l    a5,0x904
  245.         rts
  246. }
  247.  
  248. uchar    savedBits[1024];
  249. long    AllOnes[32] = {
  250.     -1, -1, -1, -1, -1, -1, -1, -1,
  251.     -1, -1, -1, -1, -1, -1, -1, -1,
  252.     -1, -1, -1, -1, -1, -1, -1, -1,
  253.     -1, -1, -1, -1, -1, -1, -1, -1
  254. };
  255. Rect restoreSrc, restoreDst;
  256. short restoreDepth;
  257.  
  258. /***************************************************************************************\
  259. |                                                                                        |
  260. |    display the ICN# pointed to by iconPtr and move the pen horizontally by moveX        |
  261. |     pass a -1 in moveX to move the standard amount, moveX should be 40 for most ICN#'s    |
  262. |                                                                                        |
  263. |    PROCEDURE INITDraw1Bit(iconPtr: ICONListPtr); EXTERNAL                                |
  264. |                                                                                        |
  265. |    pascal void INITDraw1Bit(ICONListPtr iconPtr);                                        |
  266. |                                                                                        |
  267. \***************************************************************************************/
  268.  
  269. static pascal void INITDraw1Bit(ICONListPtr iconPtr) {
  270.     INITInit();            /* initialize for drawing. */
  271.  
  272.     myBitMap.baseAddr  = (void *)iconPtr->Icon;
  273.     myMaskMap.baseAddr = (void *)iconPtr->IconMask;
  274.  
  275.     MaskAdjust();
  276.  
  277.     destRect.left += curOffset;
  278.     destRect.right += curOffset;
  279.     CopyMask(&myBitMap, &myMaskMap, &myPort.portBits, &srcRect, &srcRect, &destRect);
  280.  
  281.     INITCleanup();    /* cleanup */
  282. }
  283.  
  284.  
  285. /***************************************************************************************\
  286. |                                                                                        |
  287. |    display the Icl pointed to by iclPtr and move the pen horizontally by moveX            |
  288. |     pass a -1 in moveX to move the standard amount, moveX should be 40 for most ICN#'s    |
  289. |                                                                                        |
  290. |    PROCEDURE INITDrawXBit(iclPtr: icl_Ptr; iclDepth: Integer;                             |
  291. |                iconPtr: ICONListPtr); EXTERNAL;                                        |
  292. |                                                                                        |
  293. |    pascal void INITDrawXBit(icl_Ptr, iclDepth, moveX)                                    |
  294. |        icl_Ptr *iclPtr;                                                                |
  295. |        short iclDepth;                                                                    |
  296. |        ICONList *iconPtr;                                                                |
  297. |        extern;                                                                            |
  298. |                                                                                        |
  299. \***************************************************************************************/
  300.  
  301. static void UndoXBit(void) {
  302.     PixMapHandle pmh;
  303.     register PixMapPtr pmp;
  304.  
  305.     if (0 != (pmh = NewPixMap())) {
  306.         INITInitSimple();
  307.         HLock((Handle) pmh);
  308.         pmp = *pmh;
  309.         DisposeHandle((Handle) pmp->pmTable);
  310.         if (restoreDepth == 4) {
  311.             pmp->pmTable = gClutThing4; // (CTabHandle) RGetResource('clut', iclDepth);
  312.         } else {
  313.             pmp->pmTable = gClutThing8; // (CTabHandle) RGetResource('clut', iclDepth);
  314.         }
  315.         pmp->baseAddr = (void *)&savedBits;
  316.         pmp->rowBytes = 0x8000 | (restoreDepth * iconRowBytes);
  317.         pmp->bounds = restoreSrc;
  318.         pmp->pixelType = chunky;
  319.         pmp->pixelSize = restoreDepth;
  320.         pmp->cmpCount = 1;
  321.         pmp->cmpSize = restoreDepth;
  322.         
  323.         CopyBits((BitMap *)pmp, &myPort.portBits, &restoreSrc, &restoreDst, srcCopy, 0);
  324.  
  325.         pmp->pmTable = (void *)NewHandle(0);
  326.         DisposPixMap(pmh);
  327.  
  328.         INITCleanup();        /* cleanup, advance icon location */
  329.     }
  330. }
  331.  
  332. static pascal void INITDrawXBit(void *icl_Ptr, register short iclDepth, ICONListPtr iconPtr) {
  333.     PixMapHandle pmh;
  334.     register PixMapPtr pmp;
  335.  
  336.     if (!(pmh = NewPixMap())) {
  337.         INITDraw1Bit(iconPtr);
  338.     } else {
  339.         INITInit();            /* initialize for drawing */
  340.         HLock((Handle) pmh);
  341.         pmp = *pmh;
  342.         DisposeHandle((Handle) pmp->pmTable);
  343.         if (iclDepth == 4) {
  344.             pmp->pmTable = gClutThing4; // (CTabHandle) RGetResource('clut', iclDepth);
  345.         } else {
  346.             pmp->pmTable = gClutThing8; // (CTabHandle) RGetResource('clut', iclDepth);
  347.         }
  348.         pmp->baseAddr = icl_Ptr;
  349.         pmp->rowBytes = 0x8000 | (iclDepth * iconRowBytes);
  350.         pmp->bounds = srcRect;
  351.         pmp->pixelType = chunky;
  352.         pmp->pixelSize = iclDepth;
  353.         pmp->cmpCount = 1;
  354.         pmp->cmpSize = iclDepth;
  355.  
  356.         myMaskMap.baseAddr = (void *)iconPtr->IconMask;
  357.         MaskAdjust();
  358.         
  359.         destRect.left += curOffset;
  360.         destRect.right += curOffset;
  361.  
  362.         restoreSrc = srcRect;
  363.         restoreDst = destRect;
  364.         restoreDepth = iclDepth;
  365.         pmp->baseAddr = (void *)&savedBits;
  366.         CopyBits(&myPort.portBits, (BitMap *)pmp, &destRect, &srcRect, srcCopy, 0);
  367.         UndoBlitProc = &UndoXBit;
  368.  
  369.         pmp->baseAddr = icl_Ptr;
  370.         myMaskMap.baseAddr = (void *)iconPtr->IconMask;
  371.         CopyMask((BitMap *)pmp, &myMaskMap, &myPort.portBits, &srcRect, &srcRect, &destRect);
  372.  
  373.         pmp->pmTable = (void *)NewHandle(0);
  374.         DisposPixMap(pmh);
  375.  
  376.         INITCleanup();        /* cleanup, advance icon location */
  377.     }
  378. }